Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(class): mời người dùng vào class #85

Merged
merged 5 commits into from
Nov 30, 2024
Merged

Conversation

VawnDao
Copy link
Collaborator

@VawnDao VawnDao commented Nov 30, 2024

Summary by CodeRabbit

  • New Features

    • Introduced the ability to invite users to a class through a new modal bottom sheet.
    • Users can enter usernames or emails to send invitations.
    • Added visual feedback for successful invitations and error handling for input validation.
  • Bug Fixes

    • Improved error handling for username input.
  • Documentation

    • Updated UI components and event handling to reflect new invitation functionality.
  • Style

    • Enhanced UI elements for the invitation process, including updated icons and text fields.

Copy link
Contributor

coderabbitai bot commented Nov 30, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The changes introduce a feature for inviting users to a class within the application. This includes the addition of data transfer objects (DTOs) for requests and responses, corresponding domain models, and mappers for converting between these representations. The API service has been updated to handle invitations, and the UI has been enhanced with new components and logic to manage the invitation process, including error handling and state management.

Changes

File Path Change Summary
app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassRequestDto.kt New data class InviteToClassRequestDto added with properties classId and username.
app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassResponseDto.kt New data class InviteToClassResponseDto added with properties message and status.
app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassRequestMapper.kt New methods toDto and toModel for converting between InviteToClassRequestModel and InviteToClassRequestDto.
app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassResponseMapper.kt New methods toModel and toDto for converting between InviteToClassResponseDto and InviteToClassResponseModel.
app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt New method inviteUserToClass added to handle class invitations.
app/src/main/java/com/pwhs/quickmem/data/remote/repository/ClassRepositoryImpl.kt New method inviteToClass added to implement class invitations.
app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassRequestModel.kt New data class InviteToClassRequestModel added with properties classId and username.
app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassResponseModel.kt New data class InviteToClassResponseModel added with properties message and status.
app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt New method inviteToClass added to the repository interface.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt Modifications to integrate InviteClassBottomSheet and handle invitation events.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiAction.kt New actions OnChangeUsername and OnInviteClass added to the sealed class.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiEvent.kt New event InviteToClassSuccess added to handle successful invitations.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiState.kt New properties username, errorMessage, and isInvited added to manage UI state.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailViewModel.kt New method inviteToClass added to handle invitation logic and UI state updates.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassDetailBottomSheet.kt Updated to replace sharing functionality with invitation functionality.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassTextField.kt New composable function ClassTextField added for customizable text input.
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/InviteClassBottomSheet.kt New composable function InviteClassBottomSheet added for inviting users.
app/src/main/res/drawable/ic_card.xml Vector drawable updated with new design and color.
app/src/main/res/drawable/ic_folder.xml Attribute order modified in vector drawable, no visual change.
app/src/main/res/drawable/ic_school.xml Attribute order modified in vector drawable, no visual change.

Suggested labels

Android

🎉 In the land of code, new features arise,
Inviting to classes, oh what a surprise!
With DTOs and mappers, the flow is so neat,
A bottom sheet ready, for users to greet.
So here's to the changes, let joy be our guide,
In the world of QuickMem, let's take it in stride! 🚀

Warning

Rate limit exceeded

@nqmgaming has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 26 minutes and 11 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a690df5 and 448aa81.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between a690df5 and 448aa81.

📒 Files selected for processing (1)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailViewModel.kt (3 hunks)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (13)
app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassRequestMapper.kt (3)

6-9: Cần thêm null safety checks cho properties

Function hiện tại đã hoạt động đúng, tuy nhiên cần thêm null safety checks để tránh NPE khi properties là null.

Đề xuất thêm null checks như sau:

 fun InviteToClassRequestModel.toDto() = InviteToClassRequestDto(
-    classId = classId,
-    username = username
+    classId = classId ?: throw IllegalArgumentException("classId cannot be null"),
+    username = username ?: throw IllegalArgumentException("username cannot be null")
 )

11-14: Cần thêm null safety checks cho properties

Tương tự như function toDto(), cần thêm null safety checks cho properties.

Đề xuất thêm null checks như sau:

 fun InviteToClassRequestDto.toModel() = InviteToClassRequestModel(
-    classId = classId,
-    username = username
+    classId = classId ?: throw IllegalArgumentException("classId cannot be null"),
+    username = username ?: throw IllegalArgumentException("username cannot be null")
 )

1-14: Đề xuất cải thiện kiến trúc mapper

Để code dễ test và maintain hơn, nên tạo interface cho mapper:

interface InviteToClassRequestMapper {
    fun toDto(model: InviteToClassRequestModel): InviteToClassRequestDto
    fun toModel(dto: InviteToClassRequestDto): InviteToClassRequestModel
}

class InviteToClassRequestMapperImpl : InviteToClassRequestMapper {
    override fun toDto(model: InviteToClassRequestModel) = InviteToClassRequestDto(
        classId = model.classId ?: throw IllegalArgumentException("classId cannot be null"),
        username = model.username ?: throw IllegalArgumentException("username cannot be null")
    )

    override fun toModel(dto: InviteToClassRequestDto) = InviteToClassRequestModel(
        classId = dto.classId ?: throw IllegalArgumentException("classId cannot be null"),
        username = dto.username ?: throw IllegalArgumentException("username cannot be null")
    )
}
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiEvent.kt (1)

13-13: LGTM! Đề xuất thêm documentation cho event mới

Event mới InviteToClassSuccess được implement đúng chuẩn với Kotlin sealed class. Tuy nhiên, để code dễ maintain hơn, đề xuất thêm KDoc comment để mô tả chi tiết khi nào event này được trigger.

Đề xuất thêm documentation như sau:

+    /**
+     * Event triggered when a user is successfully invited to the class.
+     * This event should be emitted after receiving a successful response from the invitation API.
+     */
     data object InviteToClassSuccess : ClassDetailUiEvent()
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiAction.kt (1)

17-17: Đề xuất thêm comment mô tả chi tiết cho action OnInviteClass

Action được định nghĩa đúng cách, nhưng nên thêm comment để làm rõ:

  • Khi nào action này được gọi
  • Các điều kiện cần thiết trước khi gọi (ví dụ: username phải được set)

Ví dụ:

+    /**
+     * Action triggered when inviting a member to class.
+     * Requires username to be set via OnChangeUsername first.
+     */
     data object OnInviteClass : ClassDetailUiAction()
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiState.kt (2)

19-21: Cân nhắc sắp xếp lại các thuộc tính theo nhóm chức năng

Các thuộc tính mới thêm vào nên được nhóm lại với các thuộc tính liên quan để dễ đọc và bảo trì hơn.

Đề xuất sắp xếp lại như sau:

     val isLogin: Boolean = false,
     val isOwner: Boolean = false,
     val isMember: Boolean = false,
+    val isInvited: Boolean = false,
     val id: String = "",
     val title: String = "",
     val description: String = "",
     val joinClassCode: String = "",
+    val username: String = "",
     val isLoading: Boolean = false,
     val allowSet: Boolean = false,
     val allowMember: Boolean = false,
-    val username: String = "",
-    val errorMessage: String = "",
-    val statusInvite : Boolean = false,
+    val inviteErrorMessage: String = "",
     val userResponseModel: UserResponseModel = UserResponseModel(),

20-20: Đặt tên rõ ràng hơn cho biến errorMessage

Biến errorMessage khá chung chung, không thể hiện rõ loại lỗi nào. Nên đặt tên cụ thể hơn để dễ hiểu và tránh nhầm lẫn với các thông báo lỗi khác.

Đề xuất sửa thành:

-    val errorMessage: String = "",
+    val inviteErrorMessage: String = "",
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassTextField.kt (1)

16-22: Cần cải thiện khai báo hàm theo quy ước Compose

Có 2 điểm cần cải thiện:

  1. Thêm KDoc để mô tả chức năng và các tham số
  2. Di chuyển tham số modifier xuống cuối theo quy ước của Compose
@Composable
+ /**
+  * A customizable text field component for class-related input
+  *
+  * @param placeholder Text displayed when the field is empty
+  * @param value Current text value
+  * @param onValueChange Callback invoked when text changes
+  * @param errorMessage Error message to display, if any
+  * @param modifier Modifier for customizing the layout
+  */
fun ClassTextField(
-   modifier: Modifier = Modifier,
    placeholder: String = "",
    value: String = "",
    onValueChange: (String) -> Unit = {},
    errorMessage: String = "",
+   modifier: Modifier = Modifier,
)
app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt (1)

97-100: Đề xuất thêm KDoc cho function mới.

Function signature đã được khai báo đúng chuẩn, tuy nhiên nên thêm KDoc để mô tả:

  • Mục đích của function
  • Ý nghĩa của các parameters
  • Format của token
  • Các trường hợp có thể xảy ra lỗi

Ví dụ:

/**
 * Mời thành viên vào lớp học.
 *
 * @param token JWT token của user hiện tại
 * @param inviteToClassRequestModel Thông tin về lời mời
 * @return Flow chứa kết quả của việc mời thành viên
 * @throws UnauthorizedException nếu token không hợp lệ
 * @throws ForbiddenException nếu user không có quyền mời thành viên
 */
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/InviteClassBottomSheet.kt (1)

24-33: Nên tách logic kiểm tra username thành một hàm riêng

Logic kiểm tra độ dài username (>4 ký tự) đang được hardcode trong button. Nên tách thành một hàm validation riêng để dễ maintain và reuse.

Đề xuất thêm:

private fun isValidUsername(username: String): Boolean {
    return username.isNotEmpty() && username.length > 4
}
app/src/main/java/com/pwhs/quickmem/data/remote/repository/ClassRepositoryImpl.kt (1)

285-288: Thêm validation cho input parameters

Nên thêm validation cho tokeninviteToClassRequestModel trước khi gọi API:

 override suspend fun inviteToClass(
     token: String,
     inviteToClassRequestModel: InviteToClassRequestModel
 ): Flow<Resources<InviteToClassResponseModel>> {
+    require(token.isNotBlank()) { "Token không được để trống" }
+    require(inviteToClassRequestModel.classId.isNotBlank()) { "ClassId không được để trống" }
+    require(inviteToClassRequestModel.emails.isNotEmpty()) { "Danh sách email không được để trống" }
     return flow {
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailViewModel.kt (2)

438-453: Tăng cường validation cho username

Validation hiện tại chỉ kiểm tra độ dài tối thiểu. Nên bổ sung thêm:

  • Kiểm tra độ dài tối đa
  • Kiểm tra ký tự đặc biệt không hợp lệ
 if (username.isEmpty()) {
     _uiState.update {
         it.copy(
             errorMessage = "Username cannot be empty"
         )
     }
     return@launch
 }
 if (username.length < 4) {
     _uiState.update {
         it.copy(
             errorMessage = "Username must be at least 4 characters"
         )
     }
     return@launch
 }
+if (username.length > 30) {
+    _uiState.update {
+        it.copy(
+            errorMessage = "Username must not exceed 30 characters"
+        )
+    }
+    return@launch
+}
+if (!username.matches(Regex("^[a-zA-Z0-9._-]+$"))) {
+    _uiState.update {
+        it.copy(
+            errorMessage = "Username contains invalid characters"
+        )
+    }
+    return@launch
+}

469-486: Đơn giản hóa logic xử lý thành công

Có thể đơn giản hóa điều kiện lồng nhau bằng cách kiểm tra trạng thái ngay từ đầu.

 is Resources.Success -> {
+    val isSuccess = resource.data?.status == true
     _uiState.update {
         it.copy(
             isLoading = false,
-            statusInvite = resource.data?.status == true
+            statusInvite = isSuccess
         )
     }
-    if (_uiState.value.statusInvite == true) {
+    if (isSuccess) {
         _uiEvent.send(ClassDetailUiEvent.InviteToClassSuccess)
     } else {
         _uiState.update {
             it.copy(
                 errorMessage = resource.data?.message ?: "An error occurred"
             )
         }
     }
     Timber.d("Success")
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between e65b696 and b87f46d.

📒 Files selected for processing (17)
  • app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassRequestDto.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassResponseDto.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassRequestMapper.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassResponseMapper.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt (2 hunks)
  • app/src/main/java/com/pwhs/quickmem/data/remote/repository/ClassRepositoryImpl.kt (2 hunks)
  • app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassRequestModel.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassResponseModel.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt (2 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt (9 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiAction.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiEvent.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiState.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailViewModel.kt (3 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassDetailBottomSheet.kt (3 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassTextField.kt (1 hunks)
  • app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/InviteClassBottomSheet.kt (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassRequestModel.kt
  • app/src/main/java/com/pwhs/quickmem/domain/model/classes/InviteToClassResponseModel.kt
  • app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassRequestDto.kt
  • app/src/main/java/com/pwhs/quickmem/data/dto/classes/InviteToClassResponseDto.kt
🧰 Additional context used
📓 Path-based instructions (13)
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiEvent.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiAction.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassResponseMapper.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiState.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassRequestMapper.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/data/remote/repository/ClassRepositoryImpl.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailViewModel.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassDetailBottomSheet.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/InviteClassBottomSheet.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassTextField.kt (1)

Pattern **/*.kt: Thân thiện, chuyên nghiệp: Các nhận xét cần khách quan, lịch sự, tránh giọng điệu chỉ trích. Đề xuất cách cải thiện nếu thấy cần thiết, thay vì chỉ ra lỗi mà không có hướng dẫn.

Trọng tâm và hiệu quả: Nêu rõ ràng vấn đề chính, không đi quá chi tiết nếu không cần thiết, và đưa ra ví dụ cụ thể khi thảo luận về các phần cần thay đổi. Ví dụ, nếu có lỗi về logic, hãy chỉ ra phần mã cụ thể và đề xuất cách khắc phục.

Khuyến khích và ghi nhận nỗ lực: Khi có đóng góp tốt hoặc phát hiện một tính năng mới có giá trị, hãy công nhận đóng góp đó. Điều này giúp động viên các thành viên và tạo môi trường làm việc tích cực.

Sử dụng ngôn ngữ dễ hiểu: Cố gắng tránh các thuật ngữ quá kỹ thuật hoặc không cần thiết. Nếu sử dụng các thuật ngữ phức tạp, hãy đảm bảo giải thích hoặc cung cấp thêm thông tin để đảm bảo sự nhất quán và dễ hiểu cho tất cả thành viên.

Chú trọng vào cải tiến và tính bền vững: Bất cứ thay đổi nào được đề xuất đều nên chú trọng đến khả năng mở rộng và duy trì mã nguồn, cũng như ảnh hưởng đến các phần khác của hệ thống.

🔇 Additional comments (11)
app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassResponseMapper.kt (2)

1-5: LGTM! Package và imports đã được khai báo đúng cách.

Package structure và imports đã được tổ chức tốt, tuân thủ quy ước đặt tên của Kotlin.


1-14: Kiểm tra việc sử dụng mappers trong codebase.

Cần verify xem các mappers này có được sử dụng nhất quán trong các use cases liên quan đến invite-to-class không.

✅ Verification successful

Let me check the implementation details of these files to verify the mapper usage.


Mappers được sử dụng đúng và nhất quán trong codebase

Sau khi kiểm tra, tôi thấy:

  • Mappers được sử dụng đúng trong ClassRepositoryImpl: inviteToClassRequestModel.toDto()
  • ApiService sử dụng đúng các DTO types
  • ClassRepository interface định nghĩa đúng các model types
  • Có sự chuyển đổi nhất quán giữa DTO và Model thông qua mappers

Không có vấn đề gì về cách triển khai và sử dụng các mappers này.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Tìm kiếm các file sử dụng InviteToClassResponseDto và InviteToClassResponseModel
echo "Checking usage of DTOs and Models:"
rg "InviteToClassResponse(Dto|Model)" -l

# Tìm kiếm các hàm mapping
echo -e "\nChecking mapper usage:"
rg "toModel|toDto.*InviteToClass" -l

Length of output: 8842


Script:

#!/bin/bash
# Check implementation of ClassRepositoryImpl
echo "=== ClassRepositoryImpl implementation ==="
rg -A 5 "InviteToClass" app/src/main/java/com/pwhs/quickmem/data/remote/repository/ClassRepositoryImpl.kt

# Check ApiService interface
echo -e "\n=== ApiService interface ==="
rg -A 5 "InviteToClass" app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt

# Check repository interface
echo -e "\n=== ClassRepository interface ==="
rg -A 5 "InviteToClass" app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt

Length of output: 2674

app/src/main/java/com/pwhs/quickmem/data/mapper/classes/InviteToClassRequestMapper.kt (1)

1-5: LGTM! Package và imports đã được khai báo đúng cách

Package structure và imports được tổ chức rõ ràng, đúng chuẩn.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailUiAction.kt (1)

15-15: LGTM! Cấu trúc data class phù hợp cho action thay đổi username

Action này được định nghĩa đúng cách với parameter username kiểu String, phù hợp với mục đích lưu trữ tên người dùng khi mời vào lớp.

app/src/main/java/com/pwhs/quickmem/domain/repository/ClassRepository.kt (1)

12-13: LGTM! Import khai báo phù hợp.

Các import được thêm vào đúng quy chuẩn và phù hợp với tính năng mới.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/InviteClassBottomSheet.kt (1)

34-39: Cấu trúc ModalBottomSheet đã đúng

Setup đã đúng theo hướng dẫn của Material3, có xử lý dismiss và state management.

app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/component/ClassDetailBottomSheet.kt (2)

Line range hint 26-37: LGTM! Tham số mới được thêm vào phù hợp

Cấu trúc tham số và giá trị mặc định của onInviteClass tuân thủ đúng quy ước của các tham số khác trong component.


81-87: LGTM! UI mời thành viên được thêm vào đúng vị trí

  • Kiểm tra quyền owner trước khi hiển thị chức năng mời ✅
  • Sử dụng icon PersonAdd phù hợp với chức năng ✅
  • Sử dụng component ItemMenuBottomSheet nhất quán ✅
app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt (2)

208-211: LGTM: Xử lý event InviteToClassSuccess đã chính xác

Event handler đã được thêm vào đúng vị trí và hiển thị thông báo phù hợp khi invite thành công.


228-232: LGTM: Các tham số mới đã được thêm vào đúng cách

Các tham số username, errorMessage và callback onUsernameChanged đã được thêm vào với giá trị mặc định phù hợp.

app/src/main/java/com/pwhs/quickmem/data/remote/ApiService.kt (1)

37-38: LGTM! Các thay đổi đã tuân thủ quy ước và không có lỗi syntax.

Phương thức inviteUserToClass đã được thêm vào một cách chính xác với:

  • Sử dụng đúng HTTP method (POST)
  • Có xác thực qua Authorization header
  • Kiểu trả về phù hợp

Also applies to: 554-558

Comment on lines 70 to 74
Text(
"Submit", style = typography.bodyMedium.copy(
fontWeight = FontWeight.Bold
)
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Text "Submit" cần chuyển sang resource strings

Button text cũng nên được chuyển sang resource strings:

- "Submit"
+ stringResource(R.string.submit_button)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Text(
"Submit", style = typography.bodyMedium.copy(
fontWeight = FontWeight.Bold
)
)
Text(
stringResource(R.string.submit_button), style = typography.bodyMedium.copy(
fontWeight = FontWeight.Bold
)
)

Comment on lines 45 to 55
Text(
"Invite Members",
style = typography.titleLarge.copy(
fontWeight = FontWeight.Bold
)
)
Text(
"To invite members to this class, add their Quizlet usernames or emails below (separate by commas or line breaks).",
style = typography.bodyMedium,
modifier = Modifier.padding(top = 8.dp)
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Cần chuyển text sang resource strings

Các chuỗi text đang được hardcode trực tiếp trong code. Nên chuyển sang dùng resource strings để hỗ trợ đa ngôn ngữ:

- "Invite Members"
+ stringResource(R.string.invite_members_title)

- "To invite members to this class, add their Quizlet usernames or emails below (separate by commas or line breaks)."
+ stringResource(R.string.invite_members_description)

Committable suggestion skipped: line range outside the PR's diff.

@nqmgaming nqmgaming changed the title feat(invite-to-class): gọi api mời thành viên vô lớp học feat(class): mời người dùng vào class Nov 30, 2024
nqmgaming and others added 2 commits November 30, 2024 14:53
…etail/ClassDetailUiState.kt

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@nqmgaming nqmgaming merged commit 857b2d3 into main Nov 30, 2024
2 of 3 checks passed
@nqmgaming nqmgaming deleted the feat/invite-to-class branch November 30, 2024 07:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

2 participants